package Model;

import DB.Boleto.ControllerBoleto;
import DB.Inscricao.ControllerInscricao;
import br.com.nordestefomento.jrimum.bopepo.BancoSuportado;
import br.com.nordestefomento.jrimum.bopepo.Boleto;
import br.com.nordestefomento.jrimum.domkee.comum.pessoa.endereco.CEP;
import br.com.nordestefomento.jrimum.domkee.comum.pessoa.endereco.Endereco;
import br.com.nordestefomento.jrimum.domkee.comum.pessoa.endereco.UnidadeFederativa;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Agencia;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Carteira;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Cedente;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.ContaBancaria;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.NumeroDaConta;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Sacado;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.TipoDeTitulo;
import br.com.nordestefomento.jrimum.domkee.financeiro.banco.febraban.Titulo;
import java.math.BigDecimal;
import java.sql.SQLException;
import DB.Util;
import br.com.nordestefomento.jrimum.bopepo.view.BoletoViewer;
import java.io.File;
import java.io.IOException;

public class Boletos {

    long id;
    long idInscricao;

    Evento evento;
    Usuario usuario;

    Cedente cedente;
    Sacado sacado;
    Endereco endSac;
    ContaBancaria contaBancaria;
    
    Boleto boleto;
    Titulo titulo;

    public Boletos() {
    }

    public Boletos(long idInscricao) {
        this.idInscricao = idInscricao;

        ControllerInscricao ci = ControllerInscricao.getInstance();

        try {
            System.out.println("Obtendo informações do Evento");
            this.evento = ci.getEventoByID(idInscricao);
            System.out.println(evento);
            
            System.out.println("Obtendo informações do Usuario");
            this.usuario = ci.getUsuarioByID(idInscricao);
            System.out.println(usuario);
        } catch (SQLException e) {
            e.printStackTrace(System.err);
        }

        geraBoleto(idInscricao);
    }
    
    
    public Boletos(long id, long idInscricao) {
        this.id = id;
        this.idInscricao = idInscricao;

        ControllerInscricao ci = ControllerInscricao.getInstance();

        try {
            System.out.println("Obtendo informações do Evento");
            this.evento = ci.getEventoByID(idInscricao);
            System.out.println(evento);
            
            System.out.println("Obtendo informações do Usuario");
            this.usuario = ci.getUsuarioByID(idInscricao);
            System.out.println(usuario);
        } catch (SQLException e) {
            e.printStackTrace(System.err);
        }

        geraBoleto(idInscricao);
    }
    
    public void geraBoleto(long inscricaoID) {
        /*
         * INFORMANDO DADOS SOBRE O CEDENTE.
         */
        cedente = new Cedente("PMI Eventos", "999.999.999-99");

        /*
         * INFORMANDO DADOS SOBRE O SACADO.
         */
        sacado = new Sacado(usuario.getNome(), usuario.getCpf());

        // Informando o endereço do sacado.
        endSac = new Endereco();
        endSac.setUF(UnidadeFederativa.RS);
        endSac.setLocalidade(usuario.getCidade());
        endSac.setCep(new CEP(usuario.getCep()));
        endSac.setLogradouro(usuario.getEndereco());
        sacado.addEndereco(endSac);

        /*
         * INFORMANDO OS DADOS SOBRE O TÍTULO.
         */
        // Informando dados sobre a conta bancária do título.
        contaBancaria = new ContaBancaria(BancoSuportado.BANCO_DO_BRASIL.create());
        contaBancaria.setNumeroDaConta(new NumeroDaConta(54676, "3"));
        contaBancaria.setCarteira(new Carteira(30));
        contaBancaria.setAgencia(new Agencia(3134, "8"));

        titulo = new Titulo(contaBancaria, sacado, cedente);
        titulo.setNumeroDoDocumento(idInscricao + "" + evento.getId() + "" + usuario.getId());
        titulo.setNossoNumero("6669996666");
        titulo.setDigitoDoNossoNumero("9");
        titulo.setDataDoDocumento(Util.getDataHoje());
        titulo.setDataDoVencimento(Util.getDataHoje());
        titulo.setTipoDeDocumento(TipoDeTitulo.DM_DUPLICATA_MERCANTIL);
        titulo.setAceite(Titulo.EnumAceite.A);
        titulo.setDesconto(BigDecimal.ZERO);
        titulo.setValor(BigDecimal.valueOf(evento.getValor()));

        /*
         * INFORMANDO OS DADOS SOBRE O BOLETO.
         */
        boleto = new Boleto(titulo);

        String instrucaoRepetida = "Boleto referente a inscrição numero " + idInscricao + ", do usuario " + usuario.getId() + ", " + usuario.getNome() + " no evento " + evento.getId() + ", " + evento.getNome();

        boleto.setLocalPagamento("Pagavel em qualquer banco");
        boleto.setInstrucaoAoSacado(instrucaoRepetida);
        boleto.setInstrucao1(instrucaoRepetida);
        boleto.setInstrucao2("   ");
        boleto.setInstrucao3("Cobrar apenas o valor do documento, sem juros, até a data de vencimento.");
        boleto.setInstrucao4("Após o vencimento pagavel apenas no Banco do Brasil");
        
        /*
         * GERANDO O BOLETO BANCÁRIO.
         */
        // Instanciando um objeto "BoletoViewer", classe responsável pela
        // geração do boleto bancário.
        BoletoViewer boletoViewer = new BoletoViewer(boleto);

        // Gerando o arquivo. No caso o arquivo mencionado será salvo na mesma
        // pasta do projeto. Outros exemplos:
        // WINDOWS: boletoViewer.getAsPDF("C:/Temp/MeuBoleto.pdf");
        // LINUX: boletoViewer.getAsPDF("/home/temp/MeuBoleto.pdf");
        File arquivoPdf = boletoViewer.getPdfAsFile("Boleto PMI - " + idInscricao + "" + evento.getId() + "" + usuario.getId() + ".pdf");

        // Mostrando o boleto gerado na tela.
        mostreBoletoNaTela(arquivoPdf);
    }

    /**
     * Exiboletitulooeventituloo o arqusacadouarioivo na tituloeventituloola.
     *
     * @param arquivoBoleto
     */
    private static void mostreBoletoNaTela(File arquivoBoleto) {
        java.awt.Desktop desktop = java.awt.Desktop.getDesktop();

        try {
            desktop.open(arquivoBoleto);
        } catch (IOException e) {
            e.printStackTrace(System.err);
        }
    }

    public long getId() {
        return id;
    }

    public void setId(long id) {
        this.id = id;
    }

    public long getIdInscricao() {
        return idInscricao;
    }

    public void setIdInscricao(long idInscricao) {
        this.idInscricao = idInscricao;
    }

    public Evento getEvento() {
        return evento;
    }

    public void setEvento(Evento evento) {
        this.evento = evento;
    }

    public Usuario getUsuario() {
        return usuario;
    }

    public void setUsuario(Usuario usuario) {
        this.usuario = usuario;
    }

    public Cedente getCedente() {
        return cedente;
    }

    public void setCedente(Cedente cedente) {
        this.cedente = cedente;
    }

    public Sacado getSacado() {
        return sacado;
    }

    public void setSacado(Sacado sacado) {
        this.sacado = sacado;
    }

    public Endereco getEndSac() {
        return endSac;
    }

    public void setEndSac(Endereco endSac) {
        this.endSac = endSac;
    }

    public ContaBancaria getContaBancaria() {
        return contaBancaria;
    }

    public void setContaBancaria(ContaBancaria contaBancaria) {
        this.contaBancaria = contaBancaria;
    }

    public Boleto getBoleto() {
        return boleto;
    }

    public void setBoleto(Boleto boleto) {
        this.boleto = boleto;
    }

    public Titulo getTitulo() {
        return titulo;
    }

    public void setTitulo(Titulo titulo) {
        this.titulo = titulo;
    }
    
    public static void main(String args[]) {
        Boletos s = new Boletos(1);

        ControllerBoleto cb = ControllerBoleto.getInstance();
//        try {
////            cb.insert(s);
//        } catch (SQLException e) {
//            e.printStackTrace();
//        }
    }
    
    
}
